package JavaEE.NetWork4;



// 网络层:
// 核心协议就是IP协议:
// IP协议:
// 1.IP协议的报文格式:
//  1)版本(4位):ipv4/ipv6
//  2)首部长度(4位):IP协议中,报头也是可变长的,存在"选项"(IP报头最大长度60字节).
//  3)服务类型(8位):只有4位有用,4位"TOS字段",相互冲突,只能选择一位,代表四种形态:
//    最小延时:"发动时间"和"收到数据的时间"(尽量短).
//    最大吞吐量:"单位时间内传输的数据"(尽量多).
//    最高可靠性:IP本身并不考虑可靠性,在IP层面上(尽量减少丢包)的概率.
//    最小成本:消耗的系统资源(最少).
//  4)总长度(16位):描述的是整个IP数据报,"报头+载荷"总的长度
//    是否会出现64kb上限? -> 对于单个IP数据报来说,是的.
//    但是,如果需要在IP数据报中携带超过64kb的载荷数据时,
//    IP协议也是能够做到的! -> IP协议自身支持拆包/组包.
//    拆包/组包:如果传输层数据报太长了,IP自动拆成多个,每个IP数据报负责携带一部分传输层数据报.
//    拆包装包如何实现? -> 拆出来的多个IP数据报,标识(16位)是相同的,同时再通过片偏移(13位),调整正确顺序.
//  5)标志(3位):有一位不使用,有一位表示当前是否触发拆包,有一位表示当前IP数据报是否为最后一个数据报
//  6)标识(16位):用于记录被拆包的数据报的共同标识,用于拆包/装包
//  7)片偏移(13位):描述了每个IP数据报的相对位置(顺序)
//  8)生存时间"TTL"(8位):当前的IP数据报能够在网络上存活多久,单位是"次数",不是"时间"
//    初始情况下,是32/64/128.数据报每次经过路由器转发一次(TTL -= 1),
//    如果TTL为0了,还没有到达对方,那么就可以认为包永远也到不了了.就可以丢弃了.
//  9)协议(8位):描述的是"当前的IP数据报,载荷部分",是使用哪个协议.
//    接收的时候,分用的时候,就要知道当前数据包载荷部分是使用哪种协议.
//    传输层的协议中:"目的端口"就解决了这个问题(解决了传输层的数据包载荷,交给应用层的哪个协议(应用程序)来处理)
//    网络层的协议中:"8位协议"区分载荷交给传输层的哪个协议来处理.
//  10)首部检验和(16位):计算校验和,本身都是需要有开销的,IP协议只关系
//     IP报头自身是否出现传输错误,载荷部分的传输层数据,自然有TCP/UDP负责校验
//  11)源IP地址(32位):
//     如"113.132.222.29":点分十进制,把一个IP地址分成四个部分,每个部分是1个字节,每个部分的取值是0~255.
//     站在计算机的角度,识别/存储IP地址,直接使用32位的整数进行
//     理论上来说,需要给不同的设备,分配不同的IP(IP地址应该是唯一的),但是(32位最大为42亿9千万),移动互联网时代,这是不够的~
//     -----IP地址不够用咋办?-----
//     a.动态分配IP地址(上网再分配,不上网就不分配) -> 早期(IP地址不是很紧张)可行
//     b.NAT 机制(网络地址映射)[核心方案]
//       把所有的 IP 分为两个大类
//       外网IP/公网IP: 其余的都是外网IP~
//       内网IP/私网IP: "10"开头 或 "172.16~172.31"开头 或 "192.168"开头
//       (内网IP -> 局域网内部使用,保证内网IP在一个局域网内不重复即可)
//       退而求其次:不再是每个设备都有唯一的IP地址,而是"允许不同局域网中,设备的IP相同"
//     c.IPv6 从根本上解决 IP 不够用的问题
//       IPv4:使用4个字节来表示IP地址.  IPv6:使用16个字节来表示IP地址.
//     -----在"NAT"机制下,网络转发的情况:----- 比如此时有"A"和"B"两个设备.
//     a.如果A和B"都在"同一个局域网中,直接按照IP地址转发即可(同一个局域网中,即使是内网IP,也不会重复)
//     b.如果A和B"不在"同一个局域网中,禁止直接进行传输.
//     c.如果A是内网IP设备,B是外网IP设备,则"A可以主动访问B","B不能主动访问A".
//       (但是如果A已经主动访问过B了,此时B能够沿着原路,返回找到A)
//     d.如果A是外网IP设备,B也是外网IP设备,直接转发即可.
//     -----内网IP设备与外网IP设备如何通信?(NAT"网络地址转换")(内网源IP为A,外网目的IP为B,公网IP为C)-----
//     a."内网IP设备"向"外网IP设备"进行发送,构造"IP数据报",源IP为A,目的IP为B
//     b.经过一些路径,IP数据报到达"公网IP设备",并且将"源内网IP:A"转换为"源公网IP:C"(源端口号也会改)
//     c.然后以"源公网IP:C","目的外网IP:B",最终将数据报传给外网IP设备B.
//     d.B构造相应并返回响应.构造IP数据报"源外网IP:B","目的公网IP:C".
//     e.IP数据报到达C,然后再找回"内网IP:A",将"目的公网IP:C"转换成"目的内网IP:A",最终返回到A
//     (NAT相当于把网络传输分成两个阶段:"局域网内部的转发(使用局域网IP进行)","公网上的转发(使用公网IP进行)")
//     (NAT解决IP地址不够用的问题,相当于"多个内网IP(一个局域网内的所有设备)共用一个外网IP")
//     -----如果"相同局域网内多个IP设备"对"相同的外网IP设备"传输,如何知道"是哪个设备传输?"和"响应传回给哪个设备?"-----
//     "运营商路由器"在替换的时候,会记录一个映射关系:
//     旧IP:192.168.0.10 旧端口:1000 新IP:5.6.7.8 新端口:1000
//     旧IP:192.168.0.11 旧端口:1001 新IP:5.6.7.8 新端口:1001
//     而通过这个映射关系,就能够知道"发送方是哪个IP设备"以及"将响应发送给哪个IP设备"
//  12)目的IP地址(32位):同上~
// 2.地址管理:针对网络上的各种设备所在的位置,进行描述和区分 => IP地址.
//  1)网段划分:把一个IP地址,分成2个部分(网络号和主机号)
//    "192.168.100.98" -> "192.168.100"(网络号) "98"(主机号)
//    网络划分约定:同一个局域网下,所有设备的网路号必须相同,主机号必须不同.
//              对于两个相邻的局域网(由同一个路由器连接),网络号必须不同.
//    -----网络号和主机号的分配关系取决于(子网掩码)-----
//    ipconfig命令查看主机的网络信息,可能有多组,每一组对应一个"网络接口" -> 网卡/虚拟网卡
//    常用的家用路由器:255.255.255.0 -> 1111 1111 1111 1111 1111 1111 0000 0000 (前部分1,后部分0)
//    1代表网络号的位数,0代表主机号的位数. (当其他设备较多的地区(公司/商场...)使用的路由器,子网掩码可能不同(0更长))
//    -----三种特殊的IP地址:-----
//    a.主机号为全0(所有的比特位都是0)(网络地址)
//      这个IP就是特殊的IP,表示该网段不能把这个IP分配给某个具体的机器使用.形如192.168.100.0
//    b.主机号为全1(所有的比特位都是1)(广播地址)(只能基于UDP,不能基于TCP)
//      这个IP也是特殊的IP,表示该局域网的"广播IP",往这个IP上发送数据,广播给该局域网中所有的设备.
//      应用场景:手机投屏.点击投屏,显示出局域网内有哪些设备可以投屏(基于广播IP)
//      投屏软件启动时,往局域网的广播IP发送一个数据包.局域网中大部分设备不会理会(因为没有对应的投屏软件)
//      但是电视有投屏软件,收到数据后做出响应,告知手机"我的IP是...我能进行...投屏"
//      (大部分投屏本质是,把播放视频的地址告诉电视)
//    c.127.*(环回IP)
//      通过这个IP发送的数据,还能通过这个IP收到,自己发,自己收(自己投篮/抢篮板),常用(127.0.0.1)
// 3.路由选择:网络结构非常复杂,路由选择负责"挑选出合适的路径"
// -----------------------------------------------------------------
// 数据链路层:负责两个相邻节点之间的数据传输
// 最常见的数据链路层协议:
// 1.以太网(IEEE 802.3)
//   通过 网线/光纤 进行网络传输
// 2.Wifi(IEEE 802.11)
//   无线信号.
// 数据包报文格式(使用 帧):
//  1)类型(2位):载荷数据需要交给哪个协议来处理.
//  2)"目的/源"地址(6位):不是IP地址,而是"mac/物理"地址.数据链路层中提出的地址体系.
//    专注于解决"两个相邻节点的数据转发".2^48.足够大,则每个设备都有唯一的mac地址,可作为一个机器的身份标识
//    使用举例:现在有一个路径,为(甘南 -> 齐齐哈尔 -> 哈尔滨 -> 嘉兴)
//    当我从"齐齐哈尔 -> 哈尔滨"时,(源IP为甘南,目的IP为嘉兴)(源mac为齐齐哈尔,目的max为哈尔滨)
//    (源IP和目的IP代表整个行程的起点和终点),(源mac和目的mac代表其中一部分子行程的起点和终点)
//  3)数据(46-1500字节):最大1500字节,非常非常小的,1kb多一点.(不同的链路层协议,上限也不同)
// -----------------------------------------------------------------
// ARP协议:横跨(网络层)和(数据链路层)的协议
// (ARP不携带业务数据,是为了实现网络转发(给数据链路层的转发)来提供必要的支持)
// 网络转发的时候,A给B发送一个数据,A不仅要知道B的IP地址,还要知道B的mac地址(尤其是A和B相邻的时候)
// IP协议,路由器中,存在一个路由表 IP地址->网络接口(WAN/LAN)关系.
// 数据链路层协议,交换机中,存在一个转发表 max->具体的网口之间的关系.
// (ARP就是协助构造转发表的,用于获取mac地址)
// -----------------------------------------------------------------
// DNS协议:应用层的协议(域名解析系统)
// (IP地址32为数字 => 点分十进制,比较晦涩拗口.而引入"域名",通过一串实际意义的单词,表示IP地址)
// 比如:此时"我的电脑"想要访问"百度的服务器",那么会先从(DNS服务器)中询问baidu.com域名对应的ip
// 然后再通过这个ip去访问对应的服务器,那这样会出现一个问题(很多人同时想访问百度,DNS服务器会受到海量请求)
// 解决思路一:相邻的几次访问,域名和IP的映射关系不会改变,那么(浏览器对域名解析结果进行缓存),下次访问直接用缓存
//          等到很久之后,认为(缓存可信度不高了),再访问DNS服务器重新获取ip即可.
// 解决思路二:分布式系统
//          (每个国家/地区,都会架设自己的DNS服务器,里面的映射关系数据都有主DNS服务器同步而来,也就是"镜像服务器")


public class Demo1 {
    public static void main(String[] args) {

    }
}
